package com.yuyu.tt.aop;//package com.yuyu.tt.aop;
//
//import com.yuyu.tt.context.TenantContextHolder;
//import lombok.extern.slf4j.Slf4j;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.springframework.scheduling.annotation.Async;
//import org.springframework.stereotype.Component;
//
//import java.lang.reflect.Method;
//import java.util.concurrent.CompletableFuture;
//
///**
// * 切面，用于清理 TenantContextHolder 中的线程局部变量
// * 适配同步和异步方法的清理
// */
//@Aspect
//@Component
//@Slf4j
//public class CleanRequestInheritableContextHolderAspect {
//
//    /**
//     * 定义切点，监听带有 @CleanRequestInheritableContextHolder 注解的方法
//     */
//    @Pointcut("@annotation(com.yuyu.tt.annotation.CleanRequestInheritableContextHolder)")
//    public void cleanRequestInheritableContextHolder() {
//    }
//
//    /**
//     * Around advice：用于拦截带有 @CleanRequestInheritableContextHolder 注解的方法
//     * 根据同步/异步判断清理 TenantContextHolder 中的线程局部变量。
//     *
//     * @param joinPoint 切点
//     * @return 方法执行结果
//     * @throws Throwable 执行过程中可能抛出的异常
//     */
//    @Around("cleanRequestInheritableContextHolder()")
//    public Object cleanUpAsync(ProceedingJoinPoint joinPoint) throws Throwable {
//        // 获取当前执行的方法
//        Method method = getMethodFromJoinPoint(joinPoint);
//
//        // 判断是否是异步方法
//        if (method != null && isAsyncMethod(method)) {
//            // 异步方法处理：执行异步任务，返回 CompletableFuture，完成后进行清理
//            Object result = joinPoint.proceed();  // 执行方法
//            if (result instanceof CompletableFuture) {
//                CompletableFuture<Void> future = (CompletableFuture<Void>) result;
//                future.thenRun(() -> {
//                    // 在异步任务完成后清理 TenantContextHolder
//                    TenantContextHolder.removeProjectCode();
//                    log.info("TenantContextHolder cleaned up after async execution");
//                });
//            }
//            return result;
//        } else {
//            // 同步方法处理：直接执行并清理
//            Object result = joinPoint.proceed();  // 执行同步方法
//            TenantContextHolder.removeProjectCode();
//            log.info("TenantContextHolder cleaned up after sync execution");
//            return result;
//        }
//    }
//
//    /**
//     * 获取当前方法的 Method 对象
//     *
//     * @param joinPoint 切点对象
//     * @return 当前执行的方法
//     */
//    private Method getMethodFromJoinPoint(JoinPoint joinPoint) {
//        // 通过 JoinPoint 获取目标类和方法
//        String methodName = joinPoint.getSignature().getName();
//        Class<?>[] parameterTypes = ((MethodSignature) joinPoint.getSignature()).getMethod().getParameterTypes();
//        try {
//            return joinPoint.getTarget().getClass().getMethod(methodName, parameterTypes);
//        } catch (NoSuchMethodException e) {
//            log.error("获取方法时发生异常: ", e);
//            return null;
//        }
//    }
//
//    /**
//     * 判断方法是否是异步方法
//     *
//     * @param method 当前执行的方法
//     * @return 如果是异步方法返回 true
//     */
//    private boolean isAsyncMethod(Method method) {
//        return method.isAnnotationPresent(Async.class);
//    }
//}
